perm filename MIX2[MIX,SYS]1 blob
sn#196031 filedate 1976-01-14 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00013 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 SUBTTL MIXMLD - Load MLD file created by the assembler
C00008 00003 SUBTTL MIXRUN - Records status of machine during execution
C00022 00004 t←←10
C00029 00005 COMMENT DUMP ROUTINE
C00032 00006 COMMENT *RES* An attempt to increase the utility of the DUMP and
C00040 00007 STROP: [ASCIZ NOP ]
C00042 00008 STRP05: [ASCIZ NUM ]
C00046 00009 SUBTTL MIXERR
C00051 00010 SUBTTL MIX999
C00054 00011 INIT: MOVE P, [IOWD 40, PDL]
C00055 00012 BEGIN NEWS
C00059 00013 XLIST LITERALS FOLLOW
C00060 ENDMK
C⊗;
SUBTTL MIXMLD - Load MLD file created by the assembler
OUTDEC: IDIVI 10,=10
HRLM 11,(P)
SKIPE 10
PUSHJ P,OUTDEC
HLRZ 11,(P)
ADDI 11,60
OUTCHR 11
POPJ P,
QMLD: INIT 0, 10 ; init in image mode
SIXBIT /DSK/
MLDBLK
JRST ZDISK ; error return
PUSHJ P,RESCN ;*RES* LOOK FOR NAME ON PREV LINE
PUSHJ P,FINFI2 ;*RES* LOOK IT UP
JRST .+3 ;*RES*
OUTSTR [ASCIZ ⊗MIX-LOAD FILE: ⊗]
PUSHJ P,FINFO ; get file data
HRLZI 10, 'MLD'
MOVEM 10, BLK+1
MOVE 10, [XWD BLK, MLDBLK+3] ; put data into MLDBLK
BLT 10, MLDBLK+6
LOOKUP 0, MLDBLK+3 ; lookup file
JRST .-7 ; error → try again
MBOX: PUSHJ P, MLDIN ; get word
JUMPL 10, MCHAIN ; <0 → chain
JUMPE 10, MSTART ; 0 → end of file
MOVEM 10, MLDBOX ; set up box head
MOVNI 11, 17 ; counter
PUSHJ P, MLDIN ; get word
MOVEM 10, MLDBOX+20(11) ; put into box
AOJL 11, .-2 ; back for more
HLRZ 10, MLDBOX ; set up BLT pointer
HRRZ 11, MLDBOX
JUMPE 11, MBOX ; 0 → empty box
ADD 11, 10
SOJ 11,
ADD 10, [XWD MLDBOX+1, MC0000]
BLT 10, MC0000 (11) ; move box into core
JRST MBOX ; back for more
MCHAIN: HRRZ 12, 10 ; this is the value of the symbol
TLZ 10, 400000 ; mask out "-"
MOVEI 13, =4000 ; want to limit possible number of links in chain
CHAIN1: HLRZ 11, 10 ; get address of MIX word
CAIL 11, 0 ; test for out-of-bounds
CAILE 11, =3999
JRST BADCHN
SOJL 13, BADCHN ; also test for too many links
MOVE 10, MC0000 (11) ; get next chain address
HRLM 12, MC0000 (11) ; put real symbol value into MIX word
JUMPL 10, MBOX ; "-" → end of chain
JRST CHAIN1 ; back for more of chain
MSTART: PUSHJ P, MLDIN ; get starting address
ADDI 10, MC0000 ; relocate into MIX core
MOVEM 10, MLDPC0 ; save it
movei 11, symtab ; output first section of symbol table
movei 12, linked-symtab ; this many entries
mst1: pushj p, mldin ; output it
skipe 10 ; if there is an address,
addi 10, linked-4 ; make it real
movem 10, (11) ; this is the pointer
sosle 12 ; any more words left?
aoja 11, mst1 ; yes
movei 11, linked ; output second section of symbol table
movei 12, 600 ; this many entries
mst2: pushj p, mldin ; output it
trne 10, 777777 ; is there an address in the right half?
addi 10, linked-4 ; yes → make it real
movem 10, (11) ; get first word of entry
for x←1,3
{ pushj p, mldin
movem 10, (11) x ; get rest of entry
}
addi 11, 4 ; ready for next entry
sosle 12 ; any more?
jrst mst2 ; yes → get them
MOVE PC, MLDPC0 ; set PC
RELEAS 0, 0 ; release i/o channel
JRST BUTTON
BADCHN: OUTSTR [ASCIZ ⊗
#ERROR: INVALID CHAIN FOR SYMBOL WITH VALUE: ⊗]
MOVE 10, 12
PUSHJ P,OUTDEC
SETZ 10,
JRST MSTART+1
MLDPC0: 0
QPCMLD: MOVE PC, MLDPC0 ; set PC
JRST BUTTON
MLDIN: SOSG MLDBLK+2 ; decrement character count
IN 0, ; count exhausted, next buffer
JRST .+2 ; success
JRST ZMLD ; error
ILDB 10, MLDBLK+1 ; get input word
POPJ P, ; return
MLDBOX: BLOCK 20
MLDBLK: BLOCK 7
symtab: block 400 ; this is the symbol table
linked: block 600*4
SUBTTL MIXRUN - Records status of machine during execution
COMMENT ⊗ MIXRUN is the section which does all the stuff for
the RUN file. This file keeps a running record of
the status of the machine during execution.
⊗
QRUN: INIT 1, 0 ; init in ASCII mode
SIXBIT /DSK/
XWD RUNBLK, 0
JRST ZDISK
PUSHJ P,RESCN ;*RES* SEE IF FILE ON PREV LINE
PUSHJ P,FINFI2 ;*RES* LOOK IT UP
JRST .+3 ;*RES*
OUTSTR [ASCIZ ⊗FILE FOR TRACE OUTPUT: ⊗] ; get file name
PUSHJ P,FINFO
MOVE 10, [XWD BLK, RUNBLK+3]
BLT 10, RUNBLK+6
ENTER 1, RUNBLK+3 ; ENTER THE FILE
JRST .-5 ; error → try again
PUSHJ P, PAGBEG ; initialize the file
MOVNI 10, =4000 ; and zero out MAGIC counters
HRRZS MAGIC+=4000(10)
AOJL 10, .-1
JRST QRNC1
QRUNC: SETZ 10,
PUSHJ P,RESCN ;*RES* SEE IF TIMES GIVEN ON PREV LINE
MOVE 11,RECHAR ;*RES* PICK UP FIRST CHAR
JRST QRNC2 ;*RES*
QRNC1: OUTSTR [ASCII ⊗MAXIMUM PRINT TIME = ⊗]
INCHWL 11
SKIPA
INCHRW 11
CAIN 11, 15
JRST .+5
QRNC2: ANDI 11, 17
IMULI 10, =10
ADD 10, 11
JRST .-6
MOVEM 10, RUNC
INCHRW 10
CAIE 10, 12
JRST .-2
JRST BUTTON
QRUNX: RELEAS 1, 0 ; close and release channel
SETZM RUNC ; zero out RUNC
JRST BUTTON ; return to BUTTON mode
RUNBLK: BLOCK 7
ISPEC: 0 ; will hold value of PC before execution of instruction
MSPEC: 0 ; will hold value of M
RUNC: 0 ; will hold maximum print time
THISC: 0 ; will hold count for this instruction
CONTNT: 0 ; will hold contents of word addressed by MSPEC
DOTS: -1 ; will hld number of times that some line wasn't outputed
LINENO: 0
SAVEF: 0
MAGIC: BLOCK =4000 ; will hold the magic diagnostic bits
PUTCHR: SOSG RUNBLK+2
OUT 1,
JRST .+2
JRST ZDISK
IDPB 10, RUNBLK+1
POPJ P,
OPDEF PUTDEC [PUSHJ P, .]
ANDI 13, 17
PTDC0: IDIVI 10, =10
ADDI 11, 60
HRLM 11, (P)
SOSLE 13
PUSHJ P, PTDC0
HLRZ 10, (P)
JRST PUTCHR
DEFINE PUTSTR (X)
{ PUSH P, [POINT 7, X]
PUSHJ P, PTSTR0
}
PTSTR0: ILDB 10, -1(P)
JUMPN 10, .+3
POP P, -1(P)
POPJ P,
PUSHJ P, PUTCHR
JRST PTSTR0
OPDEF BIT1 [1B1]
t←←10
k←←13
z←←12
RUACSV: BLOCK 17 ;SAFE STORAGE FOR AC'S
DORUN:
MOVEM 16,RUACSV+16
MOVEI 16,RUACSV
BLT 16,RUACSV+15
MOVE 10, ISPEC ; increase count for this instruction
MOVE 11, JBUSX ; this is the number of times JBUS * executed
ADDM 11, MAGIC(10) ; so that should be the updated count
AOS MAGIC(10)
HRRZ 10, MAGIC(10) ; is it too many?
SUB 10, JBUSX ; but want 10 to be only a single increment
MOVEM 10, THISC ; save the count
HRRZ 11, ERRORC ; check if any errors
JUMPG 11, .+3
CAMLE 10, RUNC
JRST RUNDOT
AOSG T, DOTS ; was previous line dots?
JRST NODOTS ; no
MOVEI 13, 6 ; output last six digits of number of dots
PUTDEC
PUTSTR <[ASCIZ ⊗
⊗]>
SOS LINENO
NODOTS: SETOM DOTS ; reset DOTS to -1
MOVE 10, MSPEC
CAIL 10, 0
CAILE 10, =3999
SKIPA 10, [0]
MOVE 10, MC0000(10)
MOVEM 10, CONTNT
SOSG LINENO ; end-of-page?
PUSHJ P, PAGEND
MOVE 10,EXTIME ;*RES* PUT OUT TRACE INFORMATION
MOVEI 13,6 ; STARTING WITH EXECUTION TIME
PUTDEC
MOVEI 10,40
PUSHJ P,PUTCHR
MOVE 10,ISPEC ;NOW DO PROGRAM COUNTER
MOVEI 13,4
PUTDEC
MOVEI 10,40
PUSHJ P,PUTCHR
MOVE 10,THISC ;GET COUNT OF EXECUTIONS FOR THIS LOC
MOVEI 13,2
PUTDEC
MOVEI 10,40
PUSHJ P,PUTCHR
MOVEM INSTR,VALYOU ;PUT OUT INSTRUCTION WORD
MOVE 10,IMASK ; IN PROPER FORMAT
MOVEM 10,MASK
PUSHJ P,VALOUT
LDB T+1,[POINT 6,INSTR,29] ;GET FIELD SPECIFICATION
LDB K,[POINT 6,INSTR,35] ;AND OP CODE
PUTSTR <@STROP(K)> ;PUT OUT OP CODE MNEMONIC
MOVEI 10,40
PUSHJ P,PUTCHR ;AND ANOTHER BLANK
MOVE 10,MSPEC ;GET EFFECTIVE ADDRESS
MOVEM 10,VALYOU ;PUT IT OUT
MOVE 10,IRMASK ; AS A 2 BYTE INTEGER
MOVEM 10,MASK
PUSHJ P,VALOUT
MOVE 10,BMASK ;THE NEXT 2 OR 3 THINGS WRITTEN BYTEWISE
MOVEM 10,MASK
LDB 10,[POINT 6,INSTR,35] ;GET OP CODE
SKIPE PRNCNT(10) ;SEE IF CONTENTS IS TO BE PRINTED
JRST DOCNTN ;YES
MOVEI 13,=12 ;GET # OF BLANKS DESIRED
MOVEI 10,40
PUSHJ P,PUTCHR
SOJG 13,.-1 ;PUT BLANKS IN OUTPUT LINE
JRST NOCNTN
DOCNTN: MOVE 10,CONTNT ;GET CONTENTS OF EFFECTIVE ADDRESS
MOVEM 10,VALYOU
PUSHJ P,VALOUT ;PRINT CONTENTS
NOCNTN: MOVEM RA,VALYOU ;PUT OUT REGISTER A
PUSHJ P,VALOUT
MOVEM RX,VALYOU
PUSHJ P,VALOUT ;PUT OUT REGISTER X
MOVE 10,IRMASK ;CHANGE MASK FOR INDEX REGISTERS
MOVEM 10,MASK
MOVEM R1,VALYOU
PUSHJ P,VALOUT
MOVEM R2,VALYOU
PUSHJ P,VALOUT
MOVEM R3,VALYOU
PUSHJ P,VALOUT
MOVEM R4,VALYOU
PUSHJ P,VALOUT
MOVEM R5,VALYOU
PUSHJ P,VALOUT
MOVEM R6,VALYOU
PUSHJ P,VALOUT
MOVE 10,RJ ;PUT OUT J REGISTER
MOVEI 13,4
PUTDEC
MOVEI 10,40
PUSHJ P,PUTCHR
LINEND: MOVEI T, 40 ; init to space
MOVE FLAGS,RUACSV+FLAGS ;PICK UP SAVED FLAG VALUE
TLNE FLAGS, OVFLAG ; OVFLAG on?
MOVEI T, "X" ; yes
PUSHJ P, PUTCHR ; output it
MOVEI T,40
PUSHJ P,PUTCHR ;PUT OUT A BLANK TO SEPARATE
TLNE FLAGS, GFLAG ; is G on?
MOVEI T, "G" ; yes
TLNE FLAGS, EFLAG ; is E on?
MOVEI T, "E" ; yes
TLNE FLAGS, LFLAG ; is L on?
MOVEI T, "L" ; yes
PUSHJ P, PUTCHR ; output it (AT MOST 1 CAN BE ON)
PUTSTR <[ASCIZ ⊗
⊗]>
MOVSI 16,RUACSV ;RESTORE REGISTERS
BLT 16,16
POPJ P, ; return
RUNDOT: AOSG DOTS ; only output if first unprinted line
PUSHJ P, [PUTSTR <[ASCIZ ⊗........⊗]>
POPJ P,]
MOVSI 16,RUACSV
BLT 16,16 ;RESTORE REGISTERS
POPJ P,
PAGEND: MOVEI T, 14 ; form-feed
PUSHJ P, PUTCHR
PAGBEG: PUTSTR TITLE1
PUTSTR TITLE2
MOVEI T, =45
MOVEM T, LINENO
POPJ P,
TITLE1: ASCIZ ⊗
EXTIME _LOC ## ___INSTRUCTION__ __M__ __CONTENTS_ _____rA____ _____rX____⊗
TITLE2: ASCIZ ⊗ _rI1_ _rI2_ _rI3_ _rI4_ _rI5_ _rI6_ _rJ_ O C
⊗
PRNCNT: ;NON-ZERO MEANS PRINT CONTENTS FOR THIS OP CODE
0 ; 0
REPEAT =4,{1} ; 1 - 4
REPEAT =3,{0} ; 5 - 7
REPEAT =26,{1} ; 8 - 33
REPEAT =22,{0} ; 34 - 55
REPEAT =8,{1} ; 56 - 63
COMMENT ⊗ DUMP ROUTINE ⊗
ENDRUN:
SETZM DMIN
MOVEI 10,=3999
MOVEM 10,DMAX
MOVE 10,BMASK
MOVEM 10,DFALTM
DUMP:
MOVEI 10, 14
PUSHJ P, PUTCHR
PUTSTR <[ASCIZ ⊗
DUMP OF NON-ZERO LOCATIONS
_LOC ## +0 ## +1 ## +2 ## +3 ## +4
⊗]>
PUTSTR MSKMSG
PUSHJ P,PMASK ;PRINT MASK DESCRIPTION
PUTSTR <[ASCIZ /
/]>
MOVE Z,DMIN ;GET BOTTOM OF DUMP RANGE
NEXTRY: HRRZ T, MAGIC(Z)
SKIPN T
SKIPE MC0000(Z)
PUSHJ P, THISET
AOJ Z,
CAMG Z, DMAX
JRST NEXTRY
MOVEI 10, 14
PUSHJ P, PUTCHR
SETZM LINENO
JRST BUTTON
THISET: MOVE T, Z
IDIVI T, 5
IMULI T, 5
MOVE Z, T
MOVEI K, 4
MOVEM K, ZZ
PUTDEC
MOVEI T, ":"
PUSHJ P, PUTCHR
PUTSTR <[ASCIZ ⊗ ⊗]>
PUSHJ P, ENDRNZ
SOSL ZZ
AOJA Z, .-2
PUTSTR <[ASCIZ ⊗
⊗]>
POPJ P,
ZZ: 0
MSKMSG: ASCIZ / BYTE GROUPING FOR NON-EXECUTED LOCATIONS: /
ENDRNZ:
HRRZ T, MAGIC(Z)
MOVEI K, 6
PUTDEC
MOVEI T, 40
PUSHJ P, PUTCHR
MOVE K,MC0000(Z)
MOVEM K,VALYOU ;SAVE VALUE FOR VALOUT ROUTINE
HRRZ T, MAGIC(Z)
JUMPE T, NOTEX
MOVE T,IMASK
MOVEM T,MASK
PUSHJ P,VALOUT ;WRITE WITH BYTES GROUPED AS INSTR
MOVEI T," " ;FOLLOWED BY ANOTHER BLANK
PUSHJ P,PUTCHR
POPJ P,
NOTEX: MOVE T,DFALTM ;GET DEFAULT MASK
MOVEM T,MASK
PUSHJ P,VALOUT
MOVEI K,=11 ;GET STANDARD SIZE + 1
SUB K,PICSIZ ;SUB SIZE OF PRINTED MASKED OUTPUT
SKIPA T,[40] ;GET A BLANK
PUSHJ P,PUTCHR
SOJGE K,.-1 ;FILL OUT FIELD WITH BLANKS
POPJ P,
COMMENT ⊗ *RES* An attempt to increase the utility of the DUMP and
TRACE routines by allowing other formats for printing information.
⊗
BEGIN MSPARS
COMMENT ⊗ MSPARS, routine to parse a mask description of the form:
<mask>::= t | <mask>t
t::= n | (n)
n::= 1 | 2 | 3 | 4 | 5
When MSPARS is called, the first char of the description is
in register 10. Subsequent chars are obtained from the TTY by INCHWL.
On exit, locaton MASK contains the mask and register 13 contains the
total "length" (in bytes) of the masked information. The mask consists
of 4 bit bytes, each conataining an (visible/invisible) bit and a 3
bit number of bytes. A zero byte ends the mask.
⊗
↑MSPARS: ;PARSE A MASK DESCRIPTION
MOVE 13,[POINT 4,MASK]
MOVEM 13,MSKPTR ;SET UP POINTER TO MASK
SETZB 13,MASK
JRST MSP1A ;DON'T READ THE FIRST TIME
MSP1: INCHWL 10 ;GET THE NEXT CHAR
CAIN 10,40 ;IGNORE BLANKS
JRST .-2
MSP1A: CAIE 10,"(" ;IS THIS GROUP INVISIBLE?
JRST MSP3 ;NO
INCHWL 10 ;GET NUMBER OF BYTES
CAIN 10,40
JRST .-2 ;IGNORE BLANKS
CAIG 10,"5" ;SHOULD BE A DIGIT BETWEEN 1 AND 5
CAIGE 10,"1"
JRST MSP2 ;IT WASN'T
SUBI 10,"0"-10 ;CONVERT TO OCTAL AND ADD BIT 10
IDPB 10,MSKPTR ;STORE PATTERN
ADDI 13,-10(10) ;UPDATE SIZE
INCHWL 10
CAIN 10,40
JRST .-2
CAIN 10,")" ;LOOK FOR CLOSING )
JRST MSP1 ;FOUND IT
MSP2: OUTSTR [ASCIZ /ILLEGAL MASK DESCRIPTION
/]
JRST QBUTN ;READ TO END OF LINE AND GO TO BUTTON
MSP3: CAIG 10,"5" ;END OF DESCRIPTION OF NOT DIGIT
CAIGE 10,"1"
POPJ P,
SUBI 10,"0" ;CONVERT TO OCTAL
ADD 13,10
IDPB 10,MSKPTR ;STORE DESCRIPTION
JRST MSP1 ;LOOK SOME MORE
↑MSKPTR: 0
↑MASK: 0
BEND MSPARS
DFALTM: 0 ;LOCATION OF THE DEFAULT MASK FOR DUMP
IMASK: BYTE (4)2,1,1,1 ;INSTRUCTION MASK
BMASK: BYTE (4)1,1,1,1,1 ;BYTE MASK
DMASK: BYTE (4)5 ;DECIMAL MASK
IRMASK: BYTE (4)13,2 ;INDEX REGISTER MASK
BEGIN VALOUT
COMMENT ⊗ Output the value in location VALYOU as specified by the mask
in locaton MASK.
⊗
↑VALOUT: ;OUTPUT (TO TRACE FILE) A VALUE
PUSH P,10
PUSH P,11
PUSH P,12
PUSH P,13
SETZM PICSIZ ;COLLECT SIZE OF PRINTED OUTPUT
MOVEI 10,"+" ;GET THE SIGN TO PUT OUT
SKIPGE VALYOU
MOVEI 10,"-" ;CHANGE IF NEGATIVE
PUSHJ P,PUTCHR
MOVE 10,[POINT 4,MASK]
MOVEM 10,MSKPTR
MOVE 10,[POINT 6,VALYOU,5] ;SET UP POINTERS
MOVEM 10,VALPTR#
VAL1: ILDB 12,MSKPTR ;GET BYTE COUNT
JUMPE 12,VAL3 ;QUIT IF OUT OF BYTES
TRZN 12,10 ;ARE THESE INVISIBLE?
JRST VAL2 ;NO
IBP VALPTR ;MOVE PAST BYTES
SOJG 12,.-1
JRST VAL1 ;LOOK AT NEXT FIELD
VAL2: SETZB 10,13 ;INITIALIZE REGISTERS
VAL2A: ILDB 11,VALPTR ;GET NEXT BYTE
ADDI 13,2 ;INCREASE FIELD SIZE
LSH 10,6 ;COLLECT NUMBER
ADD 10,11
SOJG 12,VAL2A ;GET REQUISITE NUMBER OF BYTES
ADDM 13,PICSIZ
;
; NOW WRITE OUT NUMBER IN 10 WITH (13) DIGITS
;
PUTDEC
JRST VAL1 ;GO TO NEXT FIELD
VAL3: MOVEI 10,40
PUSHJ P,PUTCHR ;PUT BLANK AT END
POP P,13
POP P,12
POP P,11
POP P,10
POPJ P,
↑VALYOU: 0
↑PICSIZ: 0
BEND VALOUT
BEGIN RANGE
COMMENT ⊗ Routine to obtain the desired dump range from the TTY. Ranges are
of the form n:n. The default range is 0:3999. On exit, the range is in
locations DMIN and DMAX and the next input character is in 10.
Register 11 is modified by this routine.
⊗
↑RANGE:
MOVEI 11,=3999 ;INITIALIZE RANGE
MOVEM 11,DMAX
PUSHJ P,RGNUM ;LOOK FOR A NUMBER
MOVEM 11,DMIN ;MOVE 0 OR NUMBER TO DMIN
CAIN 10,":" ;IS A RANGE SPECIFIED
JRST RNG1 ;YES
SKIPE NFOUND ;WAS THERE A NUMBER AT ALL
MOVEM 11,DMAX ;YES, A SINGLE LOCATION TO DUMP
POPJ P, ;NO
RNG1: PUSHJ P,RGNUM ;GET UPPER BOUND
MOVEM 11,DMAX ;STORE IT
POPJ P, ;RETURN
RGNUM:
SETZ 11,
SETZM NFOUND# ;NO NUMBER FOUND YET
RG1: INCHWL 10
CAIN 10,40
JRST .-2 ;GET A NON-BLANK CHARACTER
CAIG 10,"9"
CAIGE 10,"0" ;IS IT A DIGIT?
JRST RG2 ;NO
IMULI 11,=10
ADDI 11,-"0"(10) ;ACCUMULATE NUMBER
SETOM NFOUND
JRST RG1
RG2: CAIL 11,=4000 ;IS IT A VALID ADDRESS
MOVEI 11,=3999 ;GIVE TOP OF CORE IF TOO BIG
SKIPA
INCHWL 10 ;GET NEXT CHAR
CAIN 10,40 ;GET NEXT NON-BLANK CHAR
JRST .-2
POPJ P,
JRST QBUTN
↑DMIN: 0
↑DMAX: 0
BEND RANGE
BEGIN PMASK
COMMENT ⊗ PRINT MASK DESCRIPTION TO TRACE FILE ⊗
↑PMASK: PUSH P,10 ;SAVE REGISTERS
PUSH P,11
PUSH P,13
SETZM PICSIZ
MOVE 11,[POINT 4,DFALTM] ;GET MASK
DMP1: ILDB 13,11 ;GET MASK ENTRY
JUMPE 13,DMP3 ;QUIT IF END OF MASK
TRZN 13,10 ;IS IT VISIBLE
JRST DMP2 ;YES
MOVEI 10,"("
PUSHJ P,PUTCHR
MOVEI 10,60(13)
PUSHJ P,PUTCHR
MOVEI 10,")"
PUSHJ P,PUTCHR
MOVEI 10,3 ;UPDATE SIZE OF PRINTED MASK
ADDM 10,PICSIZ
JRST DMP1
DMP2: MOVEI 10,60(13)
PUSHJ P,PUTCHR
AOS PICSIZ
JRST DMP1 ;LOOK AT NEXT MASK ENTRY
DMP3: POP P,13 ;RESTORE REGISTERS
POP P,11
POP P,10
POPJ P,
BEND PMASK
STROP: [ASCIZ ⊗NOP ⊗]
[ASCIZ ⊗ADD ⊗]
[ASCIZ ⊗SUB ⊗]
[ASCIZ ⊗MUL ⊗]
[ASCIZ ⊗DIV ⊗]
@STRP05(T+1)
@STRP06(T+1)
[ASCIZ ⊗MOVE⊗]
[ASCIZ ⊗LDA ⊗]
[ASCIZ ⊗LD1 ⊗]
[ASCIZ ⊗LD2 ⊗]
[ASCIZ ⊗LD3 ⊗]
[ASCIZ ⊗LD4 ⊗]
[ASCIZ ⊗LD5 ⊗]
[ASCIZ ⊗LD6 ⊗]
[ASCIZ ⊗LDX ⊗]
[ASCIZ ⊗LDAN⊗]
[ASCIZ ⊗LD1N⊗]
[ASCIZ ⊗LD2N⊗]
[ASCIZ ⊗LD3N⊗]
[ASCIZ ⊗LD4N⊗]
[ASCIZ ⊗LD5N⊗]
[ASCIZ ⊗LD6N⊗]
[ASCIZ ⊗LDXN⊗]
[ASCIZ ⊗STA ⊗]
[ASCIZ ⊗ST1 ⊗]
[ASCIZ ⊗ST2 ⊗]
[ASCIZ ⊗ST3 ⊗]
[ASCIZ ⊗ST4 ⊗]
[ASCIZ ⊗ST5 ⊗]
[ASCIZ ⊗ST6 ⊗]
[ASCIZ ⊗STX ⊗]
[ASCIZ ⊗STJ ⊗]
[ASCIZ ⊗STZ ⊗]
[ASCIZ ⊗JBUS⊗]
[ASCIZ ⊗IOC ⊗]
[ASCIZ ⊗IN ⊗]
[ASCIZ ⊗OUT ⊗]
[ASCIZ ⊗JRED⊗]
@STRP39(T+1)
@STRP40(T+1)
@STRP41(T+1)
@STRP42(T+1)
@STRP43(T+1)
@STRP44(T+1)
@STRP45(T+1)
@STRP46(T+1)
@STRP47(T+1)
@STRP48(T+1)
@STRP49(T+1)
@STRP50(T+1)
@STRP51(T+1)
@STRP52(T+1)
@STRP53(T+1)
@STRP54(T+1)
@STRP55(T+1)
[ASCIZ ⊗CMPA⊗]
[ASCIZ ⊗CMP1⊗]
[ASCIZ ⊗CMP2⊗]
[ASCIZ ⊗CMP3⊗]
[ASCIZ ⊗CMP4⊗]
[ASCIZ ⊗CMP5⊗]
[ASCIZ ⊗CMP6⊗]
[ASCIZ ⊗CMPX⊗]
STRP05: [ASCIZ ⊗NUM ⊗]
[ASCIZ ⊗CHAR⊗]
[ASCIZ ⊗HLT ⊗]
STRP06: [ASCIZ ⊗SLA ⊗]
[ASCIZ ⊗SRA ⊗]
[ASCIZ ⊗SLAX⊗]
[ASCIZ ⊗SRAX⊗]
[ASCIZ ⊗SLC ⊗]
[ASCIZ ⊗SRC ⊗]
[ASCIZ ⊗SLB ⊗]
[ASCIZ ⊗SRB ⊗]
STRP39: [ASCIZ ⊗JMP ⊗]
[ASCIZ ⊗JSJ ⊗]
[ASCIZ ⊗JOV ⊗]
[ASCIZ ⊗JNOV⊗]
[ASCIZ ⊗JL ⊗]
[ASCIZ ⊗JE ⊗]
[ASCIZ ⊗JG ⊗]
[ASCIZ ⊗JGE ⊗]
[ASCIZ ⊗JNE ⊗]
[ASCIZ ⊗JLE ⊗]
STRP40: [ASCIZ ⊗JAN ⊗]
[ASCIZ ⊗JAZ ⊗]
[ASCIZ ⊗JAP ⊗]
[ASCIZ ⊗JANN⊗]
[ASCIZ ⊗JANZ⊗]
[ASCIZ ⊗JANP⊗]
[ASCIZ ⊗JAE ⊗]
[ASCIZ ⊗JAO ⊗]
STRP41: [ASCIZ ⊗J1N ⊗]
[ASCIZ ⊗J1Z ⊗]
[ASCIZ ⊗J1P ⊗]
[ASCIZ ⊗J1NN⊗]
[ASCIZ ⊗J1NZ⊗]
[ASCIZ ⊗J1NP⊗]
[ASCIZ ⊗J1E ⊗]
[ASCIZ ⊗J1O ⊗]
STRP42: [ASCIZ ⊗J2N ⊗]
[ASCIZ ⊗J2Z ⊗]
[ASCIZ ⊗J2P ⊗]
[ASCIZ ⊗J2NN⊗]
[ASCIZ ⊗J2NZ⊗]
[ASCIZ ⊗J2NP⊗]
[ASCIZ ⊗J2E ⊗]
[ASCIZ ⊗J2O ⊗]
STRP43: [ASCIZ ⊗J3N ⊗]
[ASCIZ ⊗J3Z ⊗]
[ASCIZ ⊗J3P ⊗]
[ASCIZ ⊗J3NN⊗]
[ASCIZ ⊗J3NZ⊗]
[ASCIZ ⊗J3NP⊗]
[ASCIZ ⊗J3E ⊗]
[ASCIZ ⊗J3O ⊗]
STRP44: [ASCIZ ⊗J4N ⊗]
[ASCIZ ⊗J4Z ⊗]
[ASCIZ ⊗J4P ⊗]
[ASCIZ ⊗J4NN⊗]
[ASCIZ ⊗J4NZ⊗]
[ASCIZ ⊗J4NP⊗]
[ASCIZ ⊗J4E ⊗]
[ASCIZ ⊗J4O ⊗]
STRP45: [ASCIZ ⊗J5N ⊗]
[ASCIZ ⊗J5Z ⊗]
[ASCIZ ⊗J5P ⊗]
[ASCIZ ⊗J5NN⊗]
[ASCIZ ⊗J5NZ⊗]
[ASCIZ ⊗J5NP⊗]
[ASCIZ ⊗J5E ⊗]
[ASCIZ ⊗J5O ⊗]
STRP46: [ASCIZ ⊗J6N ⊗]
[ASCIZ ⊗J6Z ⊗]
[ASCIZ ⊗J6P ⊗]
[ASCIZ ⊗J6NN⊗]
[ASCIZ ⊗J6NZ⊗]
[ASCIZ ⊗J6NP⊗]
[ASCIZ ⊗J6E ⊗]
[ASCIZ ⊗J6O ⊗]
STRP47: [ASCIZ ⊗JXN ⊗]
[ASCIZ ⊗JXZ ⊗]
[ASCIZ ⊗JXP ⊗]
[ASCIZ ⊗JXNN⊗]
[ASCIZ ⊗JXNZ⊗]
[ASCIZ ⊗JXNP⊗]
[ASCIZ ⊗JXE ⊗]
[ASCIZ ⊗JXO ⊗]
STRP48: [ASCIZ ⊗INCA⊗]
[ASCIZ ⊗DECA⊗]
[ASCIZ ⊗ENTA⊗]
[ASCIZ ⊗ENNA⊗]
STRP49: [ASCIZ ⊗INC1⊗]
[ASCIZ ⊗DEC1⊗]
[ASCIZ ⊗ENT1⊗]
[ASCIZ ⊗ENN1⊗]
STRP50: [ASCIZ ⊗INC2⊗]
[ASCIZ ⊗DEC2⊗]
[ASCIZ ⊗ENT2⊗]
[ASCIZ ⊗ENN2⊗]
STRP51: [ASCIZ ⊗INC3⊗]
[ASCIZ ⊗DEC3⊗]
[ASCIZ ⊗ENT3⊗]
[ASCIZ ⊗ENN3⊗]
STRP52: [ASCIZ ⊗INC4⊗]
[ASCIZ ⊗DEC4⊗]
[ASCIZ ⊗ENT4⊗]
[ASCIZ ⊗ENN4⊗]
STRP53: [ASCIZ ⊗INC5⊗]
[ASCIZ ⊗DEC5⊗]
[ASCIZ ⊗ENT5⊗]
[ASCIZ ⊗ENN5⊗]
STRP54: [ASCIZ ⊗INC6⊗]
[ASCIZ ⊗DEC6⊗]
[ASCIZ ⊗ENT6⊗]
[ASCIZ ⊗ENN6⊗]
STRP55: [ASCIZ ⊗INCX⊗]
[ASCIZ ⊗DECX⊗]
[ASCIZ ⊗ENTX⊗]
[ASCIZ ⊗ENNX⊗]
SUBTTL MIXERR
DEFINE ZERROR $(A,B)
{A: OUTSTR [ASCIZ ⊗
#ERROR: ⊗]
XLIST
OUTSTR B
OUTCHR ["#"]
SOS LINENO
EXCH 10, ERRORC
AOBJN 10, .+1
EXCH 10, ERRORC
SOJ PC,
SKIPN RUNC
JRST %$A
PUTSTR <[ASCIZ ⊗#ERROR: ⊗]>
PUTSTR <B>
PUTSTR <[ASCIZ ⊗#
⊗]>
PUTSTR <[ASCIZ ⊗ PC= ⊗]>
MOVEI 13,4
MOVEI 10,-MC0000(PC)
PUTDEC
%$A: MOVEI 10,-MC0000(PC)
OUTSTR [ASCIZ ⊗ PC= ⊗]
PUSHJ P,OUTD1
JRST BUTTON
LIST
}
DEFINE WERROR $(A,B)
{A: OUTSTR [ASCIZ ⊗
#ERROR: ⊗]
XLIST
OUTSTR B
OUTCHR ["#"]
SOS LINENO
EXCH 10, ERRORC
AOBJN 10, .+1
EXCH 10, ERRORC
SOJ PC,
SKIPN RUNC
JRST %$A
PUTSTR <[ASCIZ ⊗#ERROR: ⊗]>
PUTSTR <B>
PUTSTR <[ASCIZ ⊗#
⊗]>
PUTSTR <[ASCIZ ⊗ PC= ⊗]>
MOVEI 13,4
MOVEI 10,-MC0000(PC)
PUTDEC
%$A: MOVEI 10,-MC0000(PC)
OUTSTR [ASCIZ ⊗ PC= ⊗]
PUSHJ P,OUTD1
OUTSTR [ASCIZ ⊗
CORRECT CONDITION AND HIT CONTINUE BUTTON⊗]
JRST BUTTON
LIST
}
DEFINE YERROR $(A,B,C)
{A: OUTSTR [ASCIZ ⊗
#ERROR: ⊗]
XLIST
OUTSTR B
OUTCHR ["#"]
SOS LINENO
EXCH 10, ERRORC
AOBJN 10, .+1
EXCH 10, ERRORC
SKIPN RUNC
JRST %$A
PUTSTR <[ASCIZ ⊗#ERROR: ⊗]>
PUTSTR <B>
PUTSTR <[ASCIZ ⊗#
⊗]>
PUTSTR <[ASCIZ ⊗ PC= ⊗]>
MOVEI 13,4
MOVEI 10,-MC0000-1(PC)
PUTDEC
%$A: MOVEI 10,-MC0000-1(PC)
OUTSTR [ASCIZ ⊗ PC= ⊗]
PUSHJ P,OUTD1
SKIPE ERRHLT
JRST BUTTON
C
POPJ P,
LIST
}
ERRHLT: 0 ;NON ZERO DENOTES HALT ON NON-FATAL ERRORS
ERRORC: 0
LALL
ZERROR (ZMOVER,<[ASCIZ ⊗MEMORY OVERFLOW⊗]>)
YERROR (YFIELD,<[ASCIZ ⊗INVALID FIELD-BYTE: (0:5) USED⊗]>,<MOVEI 11, 5>)
YERROR (Y2FIEL,<[ASCIZ ⊗INVALID FIELD-BYTE: 00 USED⊗]>,<SETZM SAVEF>)
YERROR (YINDEX,<[ASCIZ ⊗INVALID INDEX-BYTE: 00 USED⊗]>,<SETZ 13,>)
YERROR (YIREG,<[ASCIZ ⊗BYTES 1-3 SHOULD BE ZERO FOR INDEX REGISTERS⊗]>,<JUMP>)
YERROR (YMOVER,<[ASCIZ ⊗ILLEGAL EFFECTIVE ADDR: INSTR IGNORED⊗]>,<JRST NOP>)
ZERROR (ZEOF,<[ASCIZ ⊗END-OF-FILE ON INPUT⊗]>)
ZERROR (ZINOUT,<[ASCIZ ⊗SOME I/O ERROR⊗]>)
ZERROR (ZDISK,<[ASCIZ ⊗SOME DISK ERROR⊗]>)
WERROR (ZIOBEG,<[ASCIZ ⊗THIS DEVICE HASN'T BEEN INITIALIZED YET⊗]>)
ZERROR (ZUNIT,<[ASCIZ ⊗THIS UNIT CAN'T DO THIS I/O⊗]>)
ZERROR (ZMLD,<[ASCIZ ⊗ERROR IN .MLD INPUT⊗]>)
ZERROR (ZIOC,<[ASCIZ ⊗ILLEGAL IOC⊗]>)
ZERROR (ZRLOCK,<[ASCIZ ⊗TRYING TO LOAD BEFORE INPUT FINISHED⊗]>)
ZERROR (ZWLOCK,<[ASCIZ ⊗TRYING TO STORE BEFORE OUTPUT FINISHED⊗]>)
ZERROR (ZPCLOK,<[ASCIZ ⊗P.C. TRYING TO ACCESS BEFORE INPUT FINISHED⊗]>)
ZERROR (ZDEV,<[ASCIZ ⊗ILLEGAL DEVICE FOR JBUS OR JRED⊗]>)
XALL
SUBTTL MIX999
COMMENT ⊗ These tables are used to convert ASCII-coded characters
to MIX-coded characters and vice-versa.
"!" is used to indicate a character which cannot be converted.
"!" will be represented in MIX-code by 56.
⊗
ASCMIX:
REPEAT 40 {=56}
=00 ; <SPACE>
=56
=56
=56
=49 ; $
=56
=56
=55 ; '
=42 ; (
=43 ; )
=46 ; *
=44 ; +
=41 ; ,
=45 ; -
=40 ; .
=47 ; /
=30 ; 0
=31 ; 1
=32 ; 2
=33 ; 3
=34 ; 4
=35 ; 5
=36 ; 6
=37 ; 7
=38 ; 8
=39 ; 9
=54 ; :
=53 ; ;
=50 ; <
=48 ; =
=51 ; >
=56
=52 ; @
=01 ; A
=02 ; B
=03 ; C
=04 ; D
=05 ; E
=06 ; F
=07 ; G
=08 ; H
=09 ; I
=11 ; J
=12 ; K
=13 ; L
=14 ; M
=15 ; N
=16 ; O
=17 ; P
=18 ; Q
=19 ; R
=22 ; S
=23 ; T
=24 ; U
=25 ; V
=26 ; W
=27 ; X
=28 ; Y
=29 ; Z
=56
=56
=56
=56
=56
=56
=01 ; a
=02 ; b
=03 ; c
=04 ; d
=05 ; e
=06 ; f
=07 ; g
=08 ; h
=09 ; i
=11 ; j
=12 ; k
=13 ; l
=14 ; m
=15 ; n
=16 ; o
=17 ; p
=18 ; q
=19 ; r
=22 ; s
=23 ; t
=24 ; u
=25 ; v
=26 ; w
=27 ; x
=28 ; y
=29 ; z
=56
=56
=56
=56
=56
MIXASC:
" "
"A"
"B"
"C"
"D"
"E"
"F"
"G"
"H"
"I"
"!"
"J"
"K"
"L"
"M"
"N"
"O"
"P"
"Q"
"R"
"!"
"!"
"S"
"T"
"U"
"V"
"W"
"X"
"Y"
"Z"
"0"
"1"
"2"
"3"
"4"
"5"
"6"
"7"
"8"
"9"
"."
","
"("
")"
"+"
"-"
"*"
"/"
"="
"$"
"<"
">"
"@"
";"
":"
"'"
"!"
"!"
"!"
"!"
"!"
"!"
"!"
"!"
INIT: MOVE P, [IOWD 40, PDL]
PUSHJ P,QNEWS ;TYPE OUT ANY MESSAGES
MOVNI 10, 1
GETLIN 10
TLNN 10,420000 ;IS IT A DISPLAY OF SOME SORT
JRST NOTDPY
TLNE 10,400000
JRST ISIII ;IT'S A III
DPYPOS -150
DPYSIZ 4000+4
MOVEI PC,MC0000
PUSHJ P,REWRIT ;WRITE DD SCREEN
SETOM DDSW# ;INDICATE DD
JRST NOTDPY
ISIII: SETZM DDSW
DPYPOS -250
DPYSIZ 3000+4
UPGIOT DPYHED
NOTDPY: setzb 0, 1
setzb 2, 3
setzb 4, 5
setzb 6, 7
setzb 10, 11
setzb 12, 13
setzb 14, 15
MOVEI PC,MC0000 ;*RES* INITIALIZE PROGRAM COUNTER
jrst button
BEGIN NEWS
↑QNEWS: MOVEM 4,ACSV+4 ;SAVE REGISTERS 0-4
MOVEI 4,ACSV
BLT 4,ACSV+3
INIT 6,10 ;OPEN DISK IN IMAGE MODE
SIXBIT /DSK/
NWSBF
JRST QN3 ;NO SWEAT IF ERROR
HLLZS NWSLK+1 ;CLEAR OUT RIGHT HALF OF EXT
MOVE 0,[SIXBIT /MIXSYS/]
MOVEM 0,NWSLK+3 ;FIX UP PPN IN LOOKUP BLOCK
LOOKUP 6,NWSLK ;LOOK FOR FILE
JRST QN4 ;NO NEWS IS GOOD NEWS
;SEE IF HE REALLY WANTS TO READ THE NEWS
LDB 1,[POINT 11,NWSLK+2,23] ;GET TIME OF CREATION
IDIVI 1,=60
MOVE 0,DATE(1) ;GET HOUR
MOVEM 0,MSTIME
IDIVI 2,=10 ;GET MINUTES
ADDI 2,60
ADDI 3,60
DPB 2,[POINT 7,MSTIME+1,13]
DPB 3,[POINT 7,MSTIME+1,20]
LDB 1,[POINT 12,NWSLK+2,35] ;GET DATE OF CREATION
IDIVI 1,=31
MOVE 0,DATE+1(2) ;GET DAY OF WEEK
MOVEM 0,MSDATE
IDIVI 1,=12
MOVE 0,MONTH(2) ;GET MONTH
MOVEM 0,MSDATE+1
MOVE 0,YEAR(1) ;GET YEAR
MOVEM 0,MSDATE+2
OUTSTR MESSAG ;SEE IF HE WANTS THE NEWS
INCHRW 0 ;GET HIS ANSWER
CAIN 0,"Y" ;IS IT Y
JRST READIT
CAIE 0,"y" ;IS IT y
JRST QN4 ;NO
READIT: OUTSTR [ASCIZ /
/]
MOVE 0,[POINT 7,LINBUF] ;COLLECT A LINE AT A TIME
QN1: PUSHJ P,QIN ;GET A WORD
TRNN 3,1 ;IS IT A LINE NUMBER
JRST .+3 ;NO
PUSHJ P,QIN ;GET ANOTHER ONE
IBP 2 ;MOVE PAST INITIAL TAB
QN1B: ILDB 1,2 ;GET A CHAR
JUMPE 1,QN1 ;GO BACK IF OUT OF CHARS
IDPB 1,0 ;WRITE IT OUT
CAIE 1,12 ;IS THAT THE LF AT THE END OF THE LINE
JRST QN1B ;NO
MOVEI 1,0
IDPB 1,0 ;MAKE THE LINE AN ASCIZ STRING
OUTSTR LINBUF ;WRITE IT OUT
MOVE 0,[POINT 7,LINBUF]
JRST QN1 ;LOOK SOME MORE
QIN: SOSG NWSBF+2 ;SEE IF ANY MORE CHARS THIS BUFFER
IN 6, ;READ AGAIN
JRST .+4 ;ALL OK
STATZ 6,20000 ;CHECK FOR EOF
JRST QN1A ;EOF
JRST QN5 ;OTHER PROBLEMS
ILDB 3,NWSBF+1 ;PICK UP NEXT WORD
JUMPE 3,QIN ;IGNORE NULL WORDS
SETZ 4, ;ZERO OUT 4
MOVE 2,[POINT 7,3] ; SO THAT 2 POINTS TO ASCIZ IN 3
POPJ P,
QN1A: POP P,(P)
QN2: RELEAS 6,
INSKIP ;JUST IS CASE HE SAID ↑0
JFCL
OUTSTR [ASCIZ /
Type CR to start MIX/]
INCHWL 1 ;FIND LF
CAIE 1,12
JRST .-2
QN3: HRLZI 4,ACSV ;RESTORE REGS
BLT 4,4
POPJ P, ;RETURN
QN4: RELEAS 6, ;JUST RELEASE CHANNEL AND RETURN
JRST QN3
QN5: POP P,(P)
OUTSTR [ASCIZ /
DSK error in reading news/]
JRST QN2
NWSLK: SIXBIT /NEWS/
SIXBIT /MIX/
0
SIXBIT /MIXSYS/
NWSBF: BLOCK 3
ACSV: BLOCK 5
LINBUF: BLOCK 25
MESSAG: ASCII /Read the news as of /
MSTIME: ASCII / /
ASCII /:00 /
MSDATE: ASCII / /
ASCII / /
ASCII / /
ASCIZ /? /
BEND NEWS
XLIST ;LITERALS FOLLOW
LIT
LIST
END INIT